使用拖放操纵器可以使用户在 Kanzi 应用程序中拖放节点。请参阅 启用节点的拖放手势。
使用 拖放操纵器 (Drag and Drop Manipulator) 触发器响应拖放手势。例如,您可以设置用户拖放节点时的节点外观。请参阅 使用拖放操纵器 (Drag and Drop Manipulator) 触发器。
拖放操纵器是一种输入操纵器,您可以用于在 Kanzi 应用程序中添加手势识别到节点上。您可以通过 Kanzi Engine API 分配输入操纵器。请参阅使用输入操纵器。
通过完成教程学习如何使用拖放操纵器。请参阅 教程:拖放。
要启用节点的拖放手势:



# 符号后跟别名名称访问别名目标节点。


private:
// 定义 2D 节点的 DragAndDropManipulator::StartedMessage 消息处理程序
//这些节点带有生成拖放消息的输入操纵器。
//这样可为拖动准备 2D 节点。
void onDragStarted(DragAndDropManipulator::StartedMessageArguments& messageArguments)
{
//从消息参数获得用户拖动的节点。
Node2DSharedPtr dragAndDropNode = dynamic_pointer_cast<Node2D>(messageArguments.getSource());
if (!dragAndDropNode)
{
return;
}
//保存用户相对于节点原点(默认情况下为左上角)
//开始拖动节点的起点。
m_dragGrabOffset = messageArguments.getPoint();
//在节点上开始拖放手势时,让节点位于前面。
dragAndDropNode->moveToFront();
}
//定义 2D 节点的 DragAndDropManipulator::MovedMessage 消息处理程序
//这些节点带有生成拖放消息的输入操纵器。
//这样可按用户拖动的距离变换(移动)节点。
void onDragMoved(DragAndDropManipulator::MovedMessageArguments& messageArguments)
{
//从消息参数获得用户拖动的节点。
Node2DSharedPtr dragAndDropNode = dynamic_pointer_cast<Node2D>(messageArguments.getSource());
if (!dragAndDropNode)
{
return;
}
//相对于节点原点移动 getPoint 提供的行程距离。
//要保持从节点上相同的点开始拖动,减去抓取偏移。
SRTValue2D transform = dragAndDropNode->getLayoutTransformation();
transform.translate(messageArguments.getPoint() - m_dragGrabOffset);
dragAndDropNode->setLayoutTransformation(transform);
}
//从用户按下或点击的 DragAndDropNode 左上角偏移。
Vector2 m_dragGrabOffset;onProjectLoaded() 函数中创建 DragAndDropManipulator 并订阅其消息。
virtual void onProjectLoaded() KZ_OVERRIDE
{
ScreenSharedPtr screen = getScreen();
Domain* domain = getDomain();
//使用别名获取DragAndDropNode。
NodeSharedPtr dragAndDropNode = screen->lookupNode<Node>("#DragAndDropNode");
//创建生成拖放消息的输入操纵器。
DragAndDropManipulatorSharedPtr nodeDragAndDropManipulator = DragAndDropManipulator::create(domain);
//添加输入操纵器到 DragAndDropNode。
dragAndDropNode->addInputManipulator(nodeDragAndDropManipulator);
//在拖放开始前设置长按持续时间为 200 ms。默认值为 500 ms。
//这是用户在开始拖动节点前需按下节点的时间。
nodeDragAndDropManipulator->setPressDuration(chrono::milliseconds(200));
//订阅 DragAndDropNode 节点的 DragAndDropManipulator::StartedMessage 消息。
//DragAndDropManipulator 在用户按下该节点
//获取 DragAndDropManipulator::setPressDuration 设置的持续时间时生成此消息。
dragAndDropNode->addMessageHandler(DragAndDropManipulator::StartedMessage, bind(&MyProject::onDragStarted, this, placeholders::_1));
//订阅 DragAndDropNode 节点的 DragAndDropManipulator::MovedMessage 消息。
// DragAndDropManipulator 在手指或鼠标移动时生成此消息。
dragAndDropNode->addMessageHandler(DragAndDropManipulator::MovedMessage, bind(&MyProject::onDragMoved, this, placeholders::_1));
}使用 拖放操纵器 (Drag and Drop Manipulator) 触发器响应拖放手势。例如,您可以设置用户拖放节点时的节点外观。
拖放操纵器 (Drag and Drop Manipulator) 有这些触发器:
要使用拖放操纵器 (Drag and Drop Manipulator) 触发器:



有关详细信息,请参阅 API reference 中的 DragAndDropManipulator 类。